/**
 *    Copyright 2012 Geensoft S.A.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 **/
package ar.com.greensoft.neo.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Size;

import org.hibernate.envers.Audited;


/**
 * Representa un Internacion en el Sistema.
 * @author Jorge E. Villaverde
 * @since 06/03/2012
 * @version 1.0.0
 */
@Entity
@Table(name="internacion")
@Inheritance(strategy=InheritanceType.JOINED)
@NamedQueries({
	@NamedQuery(name=Internacion.FIND_ALL_QUERY_NAME, query="SELECT p FROM Internacion p ORDER BY p.fechaSolicitud"),
	@NamedQuery(name=Internacion.COUNT_QUERY_NAME,    query="SELECT COUNT(p) FROM Internacion p")
})
@Audited
public class Internacion extends BaseEntity {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static final String FIND_ALL_QUERY_NAME = "Internacion.findAll";
	public static final String COUNT_QUERY_NAME = "Internacion.count";

	@Enumerated(EnumType.STRING)
	@Column(name="estado_internacion")
	private EstadoInternacion estado;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_solicitud")
	private Date fechaSolicitud;
	
	@ManyToOne
    @JoinColumn(name = "solicitante")
	private PersonaFisica solicitante; 
	
	@ManyToOne
    @JoinColumn(name = "entidad_derivacion_desde")
	private PersonaJuridica derivadoDesde;
	
	@Column(name = "motivo_derivacion_desde")
	@Size(max=500)
	private String motivoDerivacionDesde;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_aprobacion")
	private Date fechaAprobacion;

	@ManyToOne
    @JoinColumn(name = "persona_aprobador")
	private PersonaFisica aprobador; 
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_rechazo")
	private Date fechaRechazo;
	
	@ManyToOne
    @JoinColumn(name = "persona_rechazante")
	private PersonaFisica rechazante; 
	
	@Column(name = "motivo_rechazo")
	@Size(max=500)
	private String motivoRechazo;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_baja")
	private Date fechaBaja;

	@Column(name = "motivo_baja")
	@Size(max=500)
	private String motivoBaja;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_baja_voluntaria")
	private Date fechaBajaVoluntaria;

	@Column(name = "motivo_baja_voluntaria")
	@Size(max=500)
	private String motivoBajaVoluntaria;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_derivacion")
	private Date fechaDerivacion;

	@ManyToOne
    @JoinColumn(name = "entidad_derivacion_hacia")
	private PersonaJuridica derivadoHacia;
	
	@Column(name = "motivo_derivacion_hacia")
	@Size(max=500)
	private String motivoDerivacionHacia;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_alta")
	private Date fechaAlta;

	@ManyToOne
    @JoinColumn(name = "persona_firma_alta")
	private PersonaFisica firmante;
	
	@Column(name = "comentarios")
	@Size(max=1000)
	private String comentarios;
	
	@Column(name = "sin_convertura")
	private boolean sinCoverturaSocial;
	
	@ManyToOne
    @JoinColumn(name = "covertura")
	private ObraSocial covertura;
	
	public EstadoInternacion getEstado() {
		return estado;
	}
	public void setEstado(EstadoInternacion estado) {
		this.estado = estado;
	}
	public Date getFechaSolicitud() {
		return fechaSolicitud;
	}
	public void setFechaSolicitud(Date fechaSolicitud) {
		this.fechaSolicitud = fechaSolicitud;
	}
	public PersonaFisica getSolicitante() {
		return solicitante;
	}
	public void setSolicitante(PersonaFisica solicitante) {
		this.solicitante = solicitante;
	}
	public PersonaJuridica getDerivadoDesde() {
		return derivadoDesde;
	}
	public void setDerivadoDesde(PersonaJuridica derivadoDesde) {
		this.derivadoDesde = derivadoDesde;
	}
	public String getMotivoDerivacionDesde() {
		return motivoDerivacionDesde;
	}
	public void setMotivoDerivacionDesde(String motivoDerivacionDesde) {
		this.motivoDerivacionDesde = motivoDerivacionDesde;
	}
	public Date getFechaAprobacion() {
		return fechaAprobacion;
	}
	public void setFechaAprobacion(Date fechaAprobacion) {
		this.fechaAprobacion = fechaAprobacion;
	}
	public PersonaFisica getAprobador() {
		return aprobador;
	}
	public void setAprobador(PersonaFisica aprobador) {
		this.aprobador = aprobador;
	}
	public Date getFechaRechazo() {
		return fechaRechazo;
	}
	public void setFechaRechazo(Date fechaRechazo) {
		this.fechaRechazo = fechaRechazo;
	}
	public PersonaFisica getRechazante() {
		return rechazante;
	}
	public void setRechazante(PersonaFisica rechazante) {
		this.rechazante = rechazante;
	}
	public String getMotivoRechazo() {
		return motivoRechazo;
	}
	public void setMotivoRechazo(String motivoRechazo) {
		this.motivoRechazo = motivoRechazo;
	}
	public Date getFechaBaja() {
		return fechaBaja;
	}
	public void setFechaBaja(Date fechaBaja) {
		this.fechaBaja = fechaBaja;
	}
	public String getMotivoBaja() {
		return motivoBaja;
	}
	public void setMotivoBaja(String motivoBaja) {
		this.motivoBaja = motivoBaja;
	}
	public Date getFechaBajaVoluntaria() {
		return fechaBajaVoluntaria;
	}
	public void setFechaBajaVoluntaria(Date fechaBajaVoluntaria) {
		this.fechaBajaVoluntaria = fechaBajaVoluntaria;
	}
	public String getMotivoBajaVoluntaria() {
		return motivoBajaVoluntaria;
	}
	public void setMotivoBajaVoluntaria(String motivoBajaVoluntaria) {
		this.motivoBajaVoluntaria = motivoBajaVoluntaria;
	}
	public Date getFechaDerivacion() {
		return fechaDerivacion;
	}
	public void setFechaDerivacion(Date fechaDerivacion) {
		this.fechaDerivacion = fechaDerivacion;
	}
	public PersonaJuridica getDerivadoHacia() {
		return derivadoHacia;
	}
	public void setDerivadoHacia(PersonaJuridica derivadoHacia) {
		this.derivadoHacia = derivadoHacia;
	}
	public String getMotivoDerivacionHacia() {
		return motivoDerivacionHacia;
	}
	public void setMotivoDerivacionHacia(String motivoDerivacionHacia) {
		this.motivoDerivacionHacia = motivoDerivacionHacia;
	}
	public Date getFechaAlta() {
		return fechaAlta;
	}
	public void setFechaAlta(Date fechaAlta) {
		this.fechaAlta = fechaAlta;
	}
	public PersonaFisica getFirmante() {
		return firmante;
	}
	public void setFirmante(PersonaFisica firmante) {
		this.firmante = firmante;
	}
	public String getComentarios() {
		return comentarios;
	}
	public void setComentarios(String comentarios) {
		this.comentarios = comentarios;
	}	
	public boolean isSinCoverturaSocial() {
		return sinCoverturaSocial;
	}
	public void setSinCoverturaSocial(boolean sinCoverturaSocial) {
		this.sinCoverturaSocial = sinCoverturaSocial;
	}
	public ObraSocial getCovertura() {
		return covertura;
	}
	public void setCovertura(ObraSocial covertura) {
		this.covertura = covertura;
	}
}
